home *** CD-ROM | disk | FTP | other *** search
/ Collection of Internet / Collection of Internet.iso / msdos / lynx / source / www / library / implemen / htmldtd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-25  |  9.1 KB  |  329 lines

  1. /*        Our Static DTD for HTML
  2. **        -----------------------
  3. **
  4. **     6 Nov 93    MD    Increased size of img_attr array to make space
  5. **                  for terminator.
  6. */
  7.  
  8. /* Implements:
  9. */
  10.  
  11. #include"capalloc.h"
  12. #include "HTMLDTD.h"
  13. #include"capstdio.h"
  14.  
  15. /*     Entity Names
  16. **    ------------
  17. **
  18. **    This table must be matched exactly with ALL the translation tables
  19. */
  20. static CONST char* entities[] = {
  21.   "AElig",    /* capital AE diphthong (ligature) */ 
  22.   "Aacute",    /* capital A, acute accent */ 
  23.   "Acirc",    /* capital A, circumflex accent */ 
  24.   "Agrave",    /* capital A, grave accent */ 
  25.   "Aring",    /* capital A, ring */ 
  26.   "Atilde",    /* capital A, tilde */ 
  27.   "Auml",    /* capital A, dieresis or umlaut mark */ 
  28.   "Ccedil",    /* capital C, cedilla */ 
  29.   "ETH",    /* capital Eth, Icelandic */ 
  30.   "Eacute",    /* capital E, acute accent */ 
  31.   "Ecirc",    /* capital E, circumflex accent */ 
  32.   "Egrave",    /* capital E, grave accent */
  33.   "Euml",    /* capital E, dieresis or umlaut mark */ 
  34.   "Iacute",    /* capital I, acute accent */ 
  35.   "Icirc",    /* capital I, circumflex accent */ 
  36.   "Igrave",    /* capital I, grave accent */ 
  37.   "Iuml",    /* capital I, dieresis or umlaut mark */ 
  38.   "Ntilde",    /* capital N, tilde */ 
  39.   "Oacute",    /* capital O, acute accent */ 
  40.   "Ocirc",    /* capital O, circumflex accent */ 
  41.   "Ograve",    /* capital O, grave accent */ 
  42.   "Oslash",    /* capital O, slash */ 
  43.   "Otilde",    /* capital O, tilde */ 
  44.   "Ouml",    /* capital O, dieresis or umlaut mark */ 
  45.   "THORN",    /* capital THORN, Icelandic */ 
  46.   "Uacute",    /* capital U, acute accent */
  47.   "Ucirc",    /* capital U, circumflex accent */ 
  48.   "Ugrave",    /* capital U, grave accent */ 
  49.   "Uuml",    /* capital U, dieresis or umlaut mark */ 
  50.   "Yacute",    /* capital Y, acute accent */ 
  51.   "aacute",    /* small a, acute accent */ 
  52.   "acirc",    /* small a, circumflex accent */ 
  53.   "aelig",    /* small ae diphthong (ligature) */ 
  54.   "agrave",    /* small a, grave accent */ 
  55.   "amp",    /* ampersand */
  56.   "aring",    /* small a, ring */ 
  57.   "atilde",    /* small a, tilde */ 
  58.   "auml",    /* small a, dieresis or umlaut mark */ 
  59.   "ccedil",    /* small c, cedilla */ 
  60.   "eacute",    /* small e, acute accent */ 
  61.   "ecirc",    /* small e, circumflex accent */ 
  62.   "egrave",    /* small e, grave accent */ 
  63.   "eth",    /* small eth, Icelandic */ 
  64.   "euml",    /* small e, dieresis or umlaut mark */ 
  65.   "gt",        /* greater than */ 
  66.   "iacute",    /* small i, acute accent */ 
  67.   "icirc",    /* small i, circumflex accent */ 
  68.   "igrave",    /* small i, grave accent */ 
  69.   "iuml",    /* small i, dieresis or umlaut mark */ 
  70.   "lt",        /* less than */ 
  71.   "ntilde",    /* small n, tilde */ 
  72.   "oacute",    /* small o, acute accent */ 
  73.   "ocirc",    /* small o, circumflex accent */ 
  74.   "ograve",    /* small o, grave accent */ 
  75.   "oslash",    /* small o, slash */ 
  76.   "otilde",    /* small o, tilde */ 
  77.   "ouml",    /* small o, dieresis or umlaut mark */ 
  78.   "szlig",    /* small sharp s, German (sz ligature) */ 
  79.   "thorn",    /* small thorn, Icelandic */ 
  80.   "uacute",    /* small u, acute accent */ 
  81.   "ucirc",    /* small u, circumflex accent */
  82.   "ugrave",    /* small u, grave accent */ 
  83.   "uuml",    /* small u, dieresis or umlaut mark */ 
  84.   "yacute",    /* small y, acute accent */ 
  85.   "yuml",    /* small y, dieresis or umlaut mark */ 
  86. };
  87.  
  88. #define HTML_ENTITIES 65
  89.  
  90.  
  91. /*        Attribute Lists
  92. **        ---------------
  93. **
  94. **    Lists must be in alphatbetical order by attribute name
  95. **    The tag elements contain the number of attributes
  96. */
  97. static attr no_attr[1] = 
  98.     {{ 0 }};
  99.  
  100. static attr a_attr[] = {        /* Anchor attributes */
  101.     { "HREF"},
  102.     { "NAME" },            /* Should be ID */
  103.     { "REL" },            /* Relationship */
  104.     { "REV" },            /* Reverse relationship */
  105.     { "TITLE" },
  106.     { "TYPE" },
  107.     { "URN" },
  108.     { 0 }    /* Terminate list */
  109. };    
  110.  
  111. static attr img_attr[HTML_IMG_ATTRIBUTES+1] = {    /* Anchor attributes */
  112.     { "ALIGN" },
  113.     { "ALT" },
  114.     { "ISMAP"},            /* Use HTTP SpaceJump instead */
  115.     { "SRC"},
  116.     { 0 }    /* Terminate list */
  117. };
  118.  
  119. static attr isIndex_attr[HTML_ISINDEX_ATTRIBUTES+1] = {    /* IsIndex attributes */
  120.     { "ACTION" },
  121.     { 0 }    /* Terminate list */
  122. };    
  123.  
  124. static attr list_attr[] = {
  125.     { "COMPACT"},
  126.     { 0 }    /* Terminate list */
  127. };
  128.  
  129. static attr glossary_attr[] = {
  130.     { "COMPACT" },
  131.     { 0 }    /* Terminate list */
  132. };
  133.  
  134. static attr nextid_attr[HTML_NEXTID_ATTRIBUTES+1] = {
  135.     { "N" },
  136.     { 0 }    /* Terminate list */
  137. };
  138.  
  139. static attr pre_attr[HTML_PRE_ATTRIBUTES+1] = {
  140.     { "WIDTH" },
  141.     { 0 }    /* Terminate list */
  142. };
  143.  
  144. /*
  145.  *    Forms stuff
  146.  */
  147. static attr form_attr[] =    {
  148.     { "ACTION" },
  149.     { "ENCTYPE" },
  150.     { "METHOD" },
  151.     { 0 }
  152. };
  153.  
  154. static attr select_attr[] =    {
  155.     { "MULTIPLE" },
  156.     { "NAME" },
  157.     { 0 }
  158. };
  159.  
  160. static attr option_attr[] =    {
  161.     { "SELECTED" },
  162.     { "VALUE" },
  163.     { 0 }
  164. };
  165.  
  166. static attr textarea_attr[] =    {
  167.     { "COLS" },
  168.     { "NAME" },
  169.     { "ROWS" },
  170.     { 0 },
  171. };
  172.  
  173. static attr input_attr[] =    {
  174.     { "CHECKED" },
  175.     { "MAXLENGTH" },
  176.     { "NAME" },
  177.     { "SIZE" },
  178.     { "TYPE" },
  179.     { "VALUE" },
  180.     { 0 }
  181. };
  182.  
  183. /*    Elements
  184. **    --------
  185. **
  186. **    Must match definitions in HTMLDTD.html!
  187. **    Must be in alphabetical order.
  188. **
  189. **    Name,     Attributes,         content
  190. */
  191. static HTTag tags[HTML_ELEMENTS] = {
  192.     { "A"    , a_attr,    HTML_A_ATTRIBUTES,    SGML_MIXED },
  193.     { "ADDRESS"    , no_attr,    0,        SGML_MIXED },
  194.     { "B"    , no_attr,    0,        SGML_MIXED },
  195.     { "BLOCKQUOTE", no_attr,    0,        SGML_MIXED },
  196.     { "BODY"    , no_attr,    0,        SGML_MIXED },
  197.     { "BR"    , no_attr,    0,        SGML_EMPTY },
  198.     { "CITE"    , no_attr,    0,        SGML_MIXED },
  199.     { "CODE"    , no_attr,    0,        SGML_MIXED },
  200.     { "COMMENT",  no_attr,    0,        SGML_MIXED },
  201.     { "DD"    , no_attr,    0,        SGML_EMPTY },
  202.     { "DFN"    , no_attr,    0,        SGML_MIXED },
  203.     { "DIR"    , list_attr,    1,        SGML_MIXED },
  204.     { "DL"    , glossary_attr,1,        SGML_MIXED },
  205.     { "DLC"    , glossary_attr,1,        SGML_MIXED },
  206.     { "DT"    , no_attr,    0,        SGML_EMPTY },
  207.     { "EM"    , no_attr,    0,        SGML_MIXED },
  208.     { "FORM"    , form_attr,    HTML_FORM_ATTRIBUTES,    SGML_MIXED },
  209.     { "H1"    , no_attr,    0,        SGML_MIXED },
  210.     { "H2"    , no_attr,    0,        SGML_MIXED },
  211.     { "H3"    , no_attr,    0,        SGML_MIXED },
  212.     { "H4"    , no_attr,    0,        SGML_MIXED },
  213.     { "H5"    , no_attr,    0,        SGML_MIXED },
  214.     { "H6"    , no_attr,    0,        SGML_MIXED },
  215.     { "H7"    , no_attr,    0,        SGML_MIXED },
  216.     { "HEAD"    , no_attr,    0,        SGML_MIXED },
  217.     { "HR"    , no_attr,    0,        SGML_EMPTY },
  218.     { "HTML"    , no_attr,    0,        SGML_MIXED },
  219.     { "I"    , no_attr,    0,        SGML_MIXED },
  220.     { "IMG"     , img_attr,    2,        SGML_EMPTY },
  221.     { "INPUT"    , input_attr,    HTML_INPUT_ATTRIBUTES,    SGML_EMPTY },
  222.     { "ISINDEX" , isIndex_attr,    HTML_ISINDEX_ATTRIBUTES,SGML_EMPTY },
  223.     { "KBD"    , no_attr,    0,        SGML_MIXED },
  224.     { "LI"    , list_attr,    1,        SGML_EMPTY },
  225.     { "LINK"    , a_attr,    HTML_A_ATTRIBUTES,    SGML_EMPTY },
  226.     { "LISTING"    , no_attr,    0,        SGML_LITTERAL },
  227.     { "MENU"    , list_attr,    1,        SGML_MIXED },
  228.     { "NEXTID"  , nextid_attr,    1,        SGML_EMPTY },
  229.     { "OL"    , list_attr,    1,        SGML_MIXED },
  230.     { "OPTION"    , option_attr,    HTML_OPTION_ATTRIBUTES,    SGML_EMPTY },
  231.     { "P"    , no_attr,    0,        SGML_EMPTY },
  232.     { "PLAINTEXT", no_attr,    0,        SGML_LITTERAL },
  233.     { "PRE"    , pre_attr,    0,        SGML_MIXED },
  234.     { "SAMP"    , no_attr,    0,        SGML_MIXED },
  235.     { "SELECT"    , select_attr,    HTML_SELECT_ATTRIBUTES,    SGML_MIXED },
  236.     { "STRONG"    , no_attr,    0,        SGML_MIXED },
  237.     { "TEXTAREA", textarea_attr,HTML_TEXTAREA_ATTRIBUTES, SGML_MIXED },
  238.     { "TITLE",       no_attr,    0,        SGML_CDATA },
  239.     { "TT"    , no_attr,    0,        SGML_MIXED },
  240.     { "U"    , no_attr,    0,        SGML_MIXED },
  241.     { "UL"    , list_attr,    1,        SGML_MIXED },
  242.     { "VAR"    , no_attr,    0,        SGML_MIXED },
  243.     { "XMP"    , no_attr,    0,        SGML_LITTERAL },
  244. };
  245.  
  246.  
  247. PUBLIC CONST SGML_dtd HTML_dtd = {
  248.     tags,
  249.     HTML_ELEMENTS,
  250.     entities,
  251.     sizeof(entities)/sizeof(char**)
  252. };
  253.  
  254. /*    Utility Routine: useful for people building HTML objects */
  255.  
  256. /*    Start anchor element
  257. **    --------------------
  258. **
  259. **    It is kinda convenient to have a particulr routine for
  260. **    starting an anchor element, as everything else for HTML is
  261. **    simple anyway.
  262. */
  263. struct _HTStructured {
  264.     HTStructuredClass * isa;
  265.     /* ... */
  266. };
  267.  
  268. PUBLIC void HTStartAnchor ARGS3(HTStructured *, obj,
  269.         CONST char *,  name,
  270.         CONST char *,  href)
  271. {
  272.     BOOL        present[HTML_A_ATTRIBUTES];
  273.     CONST char*        value[HTML_A_ATTRIBUTES];
  274.  
  275.     {
  276.     int i;
  277.     for(i=0; i<HTML_A_ATTRIBUTES; i++)
  278.         present[i] = NO;
  279.     }
  280.     if (name) {
  281.     present[HTML_A_NAME] = YES;
  282.     value[HTML_A_NAME] = name;
  283.     }
  284.     if (href) {
  285.     present[HTML_A_HREF] = YES;
  286.     value[HTML_A_HREF] = href;
  287.     }
  288.  
  289. #ifdef MSDOSMEM
  290.     {
  291.         extern void *vp_msdosmem;
  292.         extern void **vpp_msdosmem;
  293.         vp_msdosmem = (void *)(present);
  294.         vpp_msdosmem = (void **)(value);
  295.     }
  296. #endif /* MSDOSMEM */
  297.     (*obj->isa->start_element)(obj, HTML_A , present, value);
  298.  
  299. }
  300.  
  301. PUBLIC void HTNextID ARGS2(HTStructured *, obj,
  302.         int,    next_one)
  303. {
  304.     BOOL        present[HTML_NEXTID_ATTRIBUTES];
  305.     CONST char*        value[HTML_NEXTID_ATTRIBUTES];
  306.     char string[10];
  307.     
  308.     sprintf(string, "z%i", next_one);
  309.     {
  310.         int i;
  311.         for(i=0; i<HTML_NEXTID_ATTRIBUTES; i++)
  312.         present[i] = NO;
  313.     }
  314.     present[HTML_NEXTID_N] = YES;
  315.     value[HTML_NEXTID_N] = string;
  316.  
  317. #ifdef MSDOSMEM
  318.     {
  319.         extern void *vp_msdosmem;
  320.         extern void **vpp_msdosmem;
  321.         vp_msdosmem = (void *)(present);
  322.         vpp_msdosmem = (void **)(value);
  323.     }
  324. #endif /* MSDOSMEM */
  325.     (*obj->isa->start_element)(obj, HTML_NEXTID , present, value);
  326.  
  327. }
  328.  
  329.